package com.edu.baseAndBitOperations.base;

/**
 * 位运算符的操作和理解,（按位与&、按位或|、按位异或^、按位取反~）
 * 注意：进行位运算的时候，所有的操作数全部都是二进制，并且是补码!!!
 *
 * @作者 five-five
 * @创建时间 2021/4/16
 */
public class Demo04 {
    /*
        &：按位与，只有上下都为1的时候，才等于1
        |：按位或，只要上下有一方为1的时候，就等于1
        ^：按位异或，两个中不一样的时候才为1，如果一样就为0
        ~：按位取反，1变0,0变1
        <<：左移
        >>：右移
        >>>：无符号右移
     */
    public static void main(String[] args) {
        //注意：在进行位运算时时候要把数据转换成二进制位！并且全部都是二进制的补码形式。
        //按位与:&，只有上下都为1的时候，才等于1
        //3&4的结果
        //3:0b0000000000,0000000000,0000000000,11
        //4:0b0000000000,0000000000,0000000001,00
        //3&4:0b0000000000,0000000000,0000000000,00
        System.out.println(3 & 4);//0

        //注意：在进行位运算时时候要把数据转换成二进制位！并且全部都是二进制的补码形式。
        //按位或:|，只要上下有一方为1的时候，就等于1
        //3|4的结果
        //3:0b0000000000,0000000000,0000000000,11
        //4:0b0000000000,0000000000,0000000001,00
        //3|4:0b0000000000,0000000000,0000000001,11
        System.out.println(3 | 4);//7

        //注意：在进行位运算时时候要把数据转换成二进制位！并且全部都是二进制的补码形式。
        //按位异或:^，两个中不一样的时候才为1，如果一样就为0
        //3^4的结果
        //3:0b0000000000,0000000000,0000000000,11
        //4:0b0000000000,0000000000,0000000001,00
        //3^4:0b0000000000,0000000000,0000000001,11
        System.out.println(3 ^ 4);//7

        //注意：在进行位运算时时候要把数据转换成二进制位！并且全部都是二进制的补码形式。
        //按位取反:~，1变0,0变1
        //~4的结果
        //4:0b0000000000,0000000000,0000000001,00
        //~4:0b11111111111111111111111111111110,11（相当于补码）
        //反码:0b11111111111111111111111111111110,10（补码-1=反码）
        //源码:0b10000000000000000000000000000001,01（反码取反=原码）
        System.out.println(~4);//-5
    }
}
